home *** CD-ROM | disk | FTP | other *** search
Lisp/Scheme | 1988-04-07 | 3.1 KB | 99 lines | [TEXT/ttxt] |
- ;; Larry Mulcahy 1988
- ;; structures
-
- (provide 'structure)
- (require 's-expression "s-expr")
- (require 'array)
- (require 'sequence)
-
- ; (defstruct b-tree-node
- ; data
- ; (count 0)
- ; left
- ; right)
- ;
- ; causes
- ;
- ; (defmacro make-b-tree-node (&key data (count 0) left right)
- ; `(let ((result (make-array 4)))
- ; (setf (aref result 0) ,data)
- ; (setf (aref result 1) ,count)
- ; (setf (aref result 2) ,left)
- ; (setf (aref result 3) ,right)
- ; result))
- ; (defmacro copy-b-tree-node (node) `(copy-vector ,node))
- ; (defmacro b-tree-node-data (node) `(aref ,node 0))
- ; (defmacro b-tree-node-count (node) `(aref ,node 1))
- ; (defmacro b-tree-node-left (node) `(aref ,node 2))
- ; (defmacro b-tree-node-right (node) `(aref ,node 3))
- ; (defun b-tree-node-equal (n1 n2) (vector-equal n1 n2))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; defstruct
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defmacro defstruct (structure-name &rest slots)
- (let*
- ((structure-name-string (symbol-name structure-name))
- (slot-names (mapcar #'slot-name slots))
- (big (length slots))
- (comma-x (list 'comma 'x))
- (result-label (gensym))
-
- (constructor-function-name
- (intern
- (concatenate 'string "MAKE-" structure-name-string)))
-
- (slot-initialization-setqs nil)
-
- (copy-function-name
- (intern
- (concatenate 'string "COPY-" structure-name-string)))
-
- (copy-function-defmacro-expression
- `(defmacro ,copy-function-name (x) `(copy-vector ,comma-x)))
-
- (slot-access-function-names
- (mapcar #'(lambda (s) (intern
- (concatenate 'string structure-name-string
- "-"
- (symbol-name s))))
- slot-names))
-
- (slot-defining-defmacro-expressions nil)
-
- (equality-predicate-function-name
- (intern
- (concatenate 'string structure-name-string "-EQUAL")))
-
- (equality-predicate-defun-expression
- `(defun ,equality-predicate-function-name (v1 v2)
- (vector-equal v1 v2)))
-
- )
-
- (dotimes (i big)
- (push `(defmacro ,(nth i slot-access-function-names) (x)
- `(aref ,comma-x ,i))
- slot-defining-defmacro-expressions)
- (let ((comma-slot-name (list 'comma (nth i slot-names))))
- (push `(setf (aref ,result-label ,i) ,comma-slot-name)
- slot-initialization-setqs)))
-
- (let ((constructor-function-defmacro-expression
- `(defmacro ,constructor-function-name (&key ,@slots)
- `(let ((,result-label (make-array ,big)))
- ,@slot-initialization-setqs
- ,result-label))))
- `(progn
- ,constructor-function-defmacro-expression
- ,copy-function-defmacro-expression
- ,equality-predicate-defun-expression
- ,@slot-defining-defmacro-expressions))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; slot-name
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun slot-name (slot) (if (atom slot) slot (car slot)))
-